// noinspection JSUnresolvedReference /** * Field Google Map */ /* global jQuery, document, redux_change, redux, google */ (function ( $ ) { 'use strict'; redux.field_objects = redux.field_objects || {}; redux.field_objects.google_maps = redux.field_objects.google_maps || {}; /* LIBRARY INIT */ redux.field_objects.google_maps.init = function ( selector ) { if ( ! selector ) { selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' ); } $( selector ).each( function ( i ) { let delayRender; const el = $( this ); let parent = el; if ( ! el.hasClass( 'redux-field-container' ) ) { parent = el.parents( '.redux-field-container:first' ); } if ( parent.is( ':hidden' ) ) { return; } if ( parent.hasClass( 'redux-field-init' ) ) { parent.removeClass( 'redux-field-init' ); } else { return; } // Check for delay render, which is useful for calling a map // render after JavaScript load. delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) ); // API Key button. redux.field_objects.google_maps.clickHandler( el ); // Init our maps. redux.field_objects.google_maps.initMap( el, i, delayRender ); } ); }; /* INIT MAP FUNCTION */ redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) { let delayed; let scrollWheel; let streetView; let mapType; let address; let defLat; let defLong; let defaultZoom; let mapOptions; let geocoder; let g_autoComplete; let g_LatLng; let g_map; let noLatLng = false; // Pull the map class. const mapClass = el.find( '.redux_framework_google_maps' ); const containerID = mapClass.attr( 'id' ); const autocomplete = containerID + '_autocomplete'; const canvas = containerID + '_map_canvas'; const canvasId = $( '#' + canvas ); const latitude = containerID + '_latitude'; const longitude = containerID + '_longitude'; // Add map index to data attr. // Why, say we want to use delay_render, // and want to init the map later on. // You'd need the index number in the // event of multiple map instances. // This allows one to retrieve it // later. $( mapClass ).attr( 'data-idx', idx ); if ( true === delayRender ) { return; } // Map has been rendered, no need to process again. if ( $( '#' + containerID ).hasClass( 'rendered' ) ) { return; } // If a map is set to delay render and has been initiated // from another scrip, add the 'render' class so rendering // does not occur. // It messes things up. delayed = Boolean( mapClass.data( 'delay-render' ) ); if ( true === delayed ) { mapClass.addClass( 'rendered' ); } // Create the autocomplete object, restricting the search // to geographical location types. g_autoComplete = await google.maps.importLibrary( 'places' ); g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} ); // Data bindings. scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) ); streetView = Boolean( mapClass.data( 'street-view' ) ); mapType = Boolean( mapClass.data( 'map-type' ) ); address = mapClass.data( 'address' ); address = decodeURIComponent( address ); address = address.trim(); // Set default Lat/lng. defLat = canvasId.data( 'default-lat' ); defLong = canvasId.data( 'default-long' ); defaultZoom = canvasId.data( 'default-zoom' ); // Eval whether to set maps based on lat/lng or address. if ( '' !== address ) { if ( '' === defLat || '' === defLong ) { noLatLng = true; } } else { noLatLng = false; } // Can't have empty values, or the map API will complain. // Set default for the middle of the United States. defLat = defLat ? defLat : 39.11676722061108; defLong = defLong ? defLong : -100.47761000000003; if ( noLatLng ) { // If displaying a map based on an address. geocoder = new google.maps.Geocoder(); // Set up Geocode and pass address. geocoder.geocode( {'address': address}, function ( results, status ) { let latitude; let longitude; // Function results. if ( status === google.maps.GeocoderStatus.OK ) { // A good address was passed. g_LatLng = results[0].geometry.location; // Set map options. mapOptions = { center: g_LatLng, zoom: defaultZoom, streetViewControl: streetView, mapTypeControl: mapType, scrollwheel: scrollWheel, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.LEFT_BOTTOM }, mapId: 'REDUX_GOOGLE_MAPS', }; // Create map. g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions ); // Get and set lat/long data. latitude = el.find( '#' + containerID + '_latitude' ); latitude.val( results[0].geometry.location.lat() ); longitude = el.find( '#' + containerID + '_longitude' ); longitude.val( results[0].geometry.location.lng() ); redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ); } else { // No data found, alert the user. alert( 'Geocode was not successful for the following reason: ' + status ); } } ); } else { // If displaying map based on an lat/lng. g_LatLng = new google.maps.LatLng( defLat, defLong ); // Set map options. mapOptions = { center: g_LatLng, zoom: defaultZoom, // Start off far unless an item is selected, set by php. streetViewControl: streetView, mapTypeControl: mapType, scrollwheel: scrollWheel, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.LEFT_BOTTOM }, mapId: 'REDUX_GOOGLE_MAPS', }; // Create the map. g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions ); redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ); } }; redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) { let markerTooltip; let infoWindow; let g_marker; let geoAlert = mapClass.data( 'geo-alert' ); // Get HTML. const input = document.getElementById( autocomplete ); // Set objects into the map. g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input ); // Bind objects to the map. g_autoComplete = new google.maps.places.Autocomplete( input ); g_autoComplete.bindTo( 'bounds', g_map ); // Get the marker tooltip data. markerTooltip = mapClass.data( 'marker-tooltip' ); markerTooltip = decodeURIComponent( markerTooltip ); // Create infoWindow. infoWindow = new google.maps.InfoWindow(); // Create marker. g_marker = new google.maps.Marker( { position: g_LatLng, map: g_map, anchorPoint: new google.maps.Point( 0, - 29 ), draggable: true, title: markerTooltip, animation: google.maps.Animation.DROP } ); geoAlert = decodeURIComponent( geoAlert ); // Place change. google.maps.event.addListener( g_autoComplete, 'place_changed', function () { let place; let address; let markerTooltip; infoWindow.close(); // Get place data. place = g_autoComplete.getPlace(); // Display alert if something went wrong. if ( ! place.geometry ) { window.alert( geoAlert ); return; } console.log( place.geometry.viewport ); // If the place has a geometry, then present it on a map. if ( place.geometry.viewport ) { g_map.fitBounds( place.geometry.viewport ); } else { g_map.setCenter( place.geometry.location ); g_map.setZoom( 17 ); // Why 17? Because it looks good. } markerTooltip = mapClass.data( 'marker-tooltip' ); markerTooltip = decodeURIComponent( markerTooltip ); // Set the marker icon. g_marker = new google.maps.Marker( { position: g_LatLng, map: g_map, anchorPoint: new google.maps.Point( 0, - 29 ), title: markerTooltip, clickable: true, draggable: true, animation: google.maps.Animation.DROP } ); // Set marker position and display. g_marker.setPosition( place.geometry.location ); g_marker.setVisible( true ); // Form array of address components. address = ''; if ( place.address_components ) { address = [( place.address_components[0] && place.address_components[0].short_name || '' ), ( place.address_components[1] && place.address_components[1].short_name || '' ), ( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' ); } // Set the default marker info window with address data. infoWindow.setContent( '
' + place.name + '
' + address ); infoWindow.open( g_map, g_marker ); // Run Geolocation. redux.field_objects.google_maps.geoLocate( g_autoComplete ); // Fill in address inputs. redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete ); } ); // Marker drag. google.maps.event.addListener( g_marker, 'drag', function ( event ) { document.getElementById( latitude ).value = event.latLng.lat(); document.getElementById( longitude ).value = event.latLng.lng(); } ); // End marker drag. google.maps.event.addListener( g_marker, 'dragend', function () { redux_change( el.find( '.redux_framework_google_maps' ) ); } ); // Zoom Changed. g_map.addListener( 'zoom_changed', function () { el.find( '.google_m_zoom_input' ).val( g_map.getZoom() ); } ); // Marker Info Window. infoWindow = new google.maps.InfoWindow(); google.maps.event.addListener( g_marker, 'click', function () { const marker_info = containerID + '_marker_info'; const infoValue = document.getElementById( marker_info ).value; if ( '' !== infoValue ) { infoWindow.setContent( infoValue ); infoWindow.open( g_map, g_marker ); } } ); }; /* FILL IN ADDRESS FUNCTION */ redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) { // Set variables. const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' ); // What if someone only wants city, or state, ect... // gotta do it this way to check for the address! // Need to check each of the returned components to see what is returned. const componentForm = { street_number: 'short_name', route: 'long_name', locality: 'long_name', administrative_area_level_1: 'short_name', country: 'long_name', postal_code: 'short_name' }; // Get the place details from the autocomplete object. const place = g_autoComplete.getPlace(); let component; let i; let addressType; let _d_addressType; let val; let len; document.getElementById( latitude ).value = place.geometry.location.lat(); document.getElementById( longitude ).value = place.geometry.location.lng(); for ( component in componentForm ) { if ( componentForm.hasOwnProperty( component ) ) { // Push in the dynamic form element ID again. component = containerID + '_' + component; // Assign to proper place. document.getElementById( component ).value = ''; document.getElementById( component ).disabled = false; } } // Get each component of the address from the place details // and fill the corresponding field on the form. len = place.address_components.length; for ( i = 0; i < len; i += 1 ) { addressType = place.address_components[i].types[0]; if ( componentForm[addressType] ) { // Push in the dynamic form element ID again. _d_addressType = containerID + '_' + addressType; // Get the original. val = place.address_components[i][componentForm[addressType]]; // Assign to proper place. document.getElementById( _d_addressType ).value = val; } } }; redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) { if ( navigator.geolocation ) { navigator.geolocation.getCurrentPosition( function ( position ) { const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude ); const circle = new google.maps.Circle( { center: geolocation, radius: position.coords.accuracy } ); g_autoComplete.setBounds( circle.getBounds() ); } ); } }; /* API BUTTON CLICK HANDLER */ redux.field_objects.google_maps.clickHandler = function ( el ) { // Find the API Key button and react on click. el.find( '.google_m_api_key_button' ).on( 'click', function () { // Find message wrapper. const wrapper = el.find( '.google_m_api_key_wrapper' ); if ( wrapper.is( ':visible' ) ) { // If the wrapper is visible, close it. wrapper.slideUp( 'fast', function () { el.find( '#google_m_api_key_input' ).trigger( 'focus' ); } ); } else { // If the wrapper is visible, open it. wrapper.slideDown( 'medium', function () { el.find( '#google_m_api_key_input' ).trigger( 'focus' ); } ); } } ); el.find( '.google_m_autocomplete' ).on( 'keypress', function ( e ) { if ( 13 === e.keyCode ) { e.preventDefault(); } } ); // Auto select autocomplete contents, // since Google doesn't do this inherently. el.find( '.google_m_autocomplete' ).on( 'click', function ( e ) { $( this ).trigger( 'focus' ); $( this ).trigger( 'select' ); e.preventDefault(); } ); }; } )( jQuery ); Chiến Thắng Ngay Trong Tầm Tay Với 1xbet Nền Tảng Giải Trí Đổi Vận, Đầy ắp Ưu Đãi! – Orchid Group
Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54

Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54

Chiến Thắng Ngay Trong Tầm Tay Với 1xbet: Nền Tảng Giải Trí Đổi Vận, Đầy ắp Ưu Đãi!

Trong thế giới giải trí trực tuyến ngày càng phát triển, việc tìm kiếm một nền tảng uy tín và đa dạng luôn là ưu tiên hàng đầu của những người chơi. 1xbet nổi lên như một địa chỉ đáng tin cậy, mang đến những trải nghiệm cá cược và giải trí hàng đầu. Nền tảng này không chỉ cung cấp một loạt các trò chơi hấp dẫn mà còn thường xuyên có những chương trình khuyến mãi, ưu đãi đặc biệt, giúp người chơi có cơ hội gia tăng giá trị giải trí của mình.

Với giao diện thân thiện, dễ sử dụng và dịch vụ hỗ trợ khách hàng tận tình, 1xbet đã nhanh chóng chiếm được lòng tin của đông đảo người chơi. Đây không chỉ là nơi để giải trí mà còn là nơi để thử thách trí thông minh và may mắn, đồng thời có cơ hội giành được những phần thưởng giá trị.

Giới Thiệu Tổng Quan Về Nền Tảng 1xbet

1xbet là một nền tảng giải trí trực tuyến cung cấp đa dạng các hình thức cá cược và trò chơi, bao gồm cá cược thể thao, sòng bạc trực tuyến, game bài và nhiều trò chơi khác. Với giấy phép hoạt động hợp pháp, 1xbet cam kết mang đến cho người chơi một môi trường giải trí an toàn, minh bạch và công bằng. Nền tảng này liên tục cập nhật và cải tiến để đáp ứng nhu cầu ngày càng cao của người chơi.

Tính Năng Mô Tả
Cá Cược Thể Thao Cung cấp các môn thể thao phổ biến như bóng đá, bóng rổ, tennis, và nhiều môn khác.
Sòng Bạc Trực Tuyến Đa dạng các trò chơi casino như blackjack, roulette, poker, và slot game.
Khuyến Mãi Thường xuyên có các chương trình khuyến mãi hấp dẫn cho cả người chơi mới và người chơi cũ.
Hỗ Trợ Khách Hàng Dịch vụ hỗ trợ khách hàng 24/7 thông qua nhiều kênh liên lạc khác nhau.

Các Loại Trò Chơi Phổ Biến Trên 1xbet

1xbet nổi tiếng với sự đa dạng trong các loại trò chơi. Bên cạnh cá cược thể thao, sòng bạc trực tuyến là một điểm hấp dẫn lớn. Người chơi có thể tham gia vào các trò chơi như baccarat, roulette, blackjack, và nhiều trò chơi slot game với đồ họa sắc nét và âm thanh sống động. Ngoài ra, nền tảng này còn cung cấp các trò chơi game bài độc đáo, mang đến những trải nghiệm giải trí mới lạ và thú vị.

Slots Game – Thiên Đường Của Người Chơi

Các trò chơi slot game tại 1xbet được thiết kế với nhiều chủ đề khác nhau, từ cổ điển đến hiện đại, đáp ứng sở thích đa dạng của người chơi. Các slot game không chỉ mang đến cơ hội giành chiến thắng lớn mà còn là một hình thức giải trí thư giãn, giảm căng thẳng. Với hệ thống đặt cược linh hoạt, người chơi có thể tùy chỉnh mức cược theo khả năng tài chính của mình.

Để giúp người chơi dễ dàng lựa chọn, 1xbet đã phân loại các slot game theo nhiều tiêu chí, bao gồm nhà cung cấp trò chơi, chủ đề và tính năng đặc biệt. Điều này giúp người chơi tiết kiệm thời gian và tìm được những trò chơi phù hợp nhất với sở thích của mình. Các trò chơi slot game thường xuyên được cập nhật các phiên bản mới, mang đến những trải nghiệm độc đáo và hấp dẫn.

Ngoài ra, 1xbet còn tổ chức các giải đấu slot game với giải thưởng lớn, tạo cơ hội cho người chơi cạnh tranh và thể hiện kỹ năng của mình.

Cá Cược Thể Thao – Đam Mê Không Giới Hạn

Cá cược thể thao là một trong những dịch vụ chính của 1xbet, cung cấp đa dạng các môn thể thao phổ biến như bóng đá, bóng rổ, tennis, cầu lông, và nhiều môn khác. Người chơi có thể tham gia cá cược vào các trận đấu đang diễn ra hoặc các giải đấu lớn trên toàn thế giới. Với tỷ lệ cược hấp dẫn và thông tin trận đấu đầy đủ, 1xbet mang đến cho người chơi những trải nghiệm cá cược chuyên nghiệp và thú vị.

Nền tảng này cung cấp nhiều loại kèo cược khác nhau, bao gồm kèo châu Âu, kèo châu Á, kèo tài xỉu, và nhiều kèo đặc biệt khác. Điều này giúp người chơi có nhiều lựa chọn và cơ hội giành chiến thắng. 1xbet cũng cung cấp các công cụ hỗ trợ cá cược, như lịch sử cá cược, thống kê trận đấu, và thông tin đội hình, giúp người chơi đưa ra những quyết định đúng đắn.

Ngoài ra, 1xbet còn tổ chức các chương trình khuyến mãi đặc biệt dành cho người chơi cá cược thể thao, như hoàn trả tiền cược, thưởng thêm tiền cược, và nhiều ưu đãi khác.

Hướng Dẫn Đăng Ký Và Giao Dịch Trên 1xbet

Việc đăng ký tài khoản trên 1xbet rất đơn giản và nhanh chóng. Người chơi chỉ cần truy cập vào trang web chính thức của 1xbet, điền đầy đủ thông tin cá nhân, xác nhận email và số điện thoại, và hoàn tất quá trình đăng ký. Sau khi đăng ký thành công, người chơi có thể đăng nhập vào tài khoản và bắt đầu trải nghiệm các dịch vụ giải trí.

  • Đăng Ký: Điền đầy đủ thông tin cá nhân và xác minh tài khoản.
  • Nạp Tiền: Chọn phương thức thanh toán phù hợp và thực hiện giao dịch.
  • Rút Tiền: Chọn số tiền muốn rút và phương thức thanh toán.
  • Bảo Mật: Luôn giữ bí mật thông tin tài khoản và sử dụng mật khẩu mạnh.

Ưu Đãi và Khuyến Mãi Tại 1xbet

1xbet nổi tiếng với các chương trình khuyến mãi hấp dẫn dành cho cả người chơi mới và người chơi cũ. Những ưu đãi này có thể bao gồm tiền thưởng chào mừng, hoàn trả tiền cược, thưởng thêm tiền cược, và nhiều ưu đãi khác. Các chương trình khuyến mãi thường xuyên được cập nhật và thay đổi, mang đến cho người chơi nhiều cơ hội gia tăng giá trị giải trí của mình.

  1. Tiền thưởng chào mừng cho người chơi mới.
  2. Hoàn trả tiền cược hàng tuần.
  3. Thưởng thêm tiền cược cho các sự kiện thể thao đặc biệt.
  4. Các chương trình khuyến mãi dành riêng cho thành viên VIP.
Loại Khuyến Mãi Điều Kiện Giá Trị
Tiền thưởng chào mừng Nạp tiền lần đầu tiên 100% lên đến 5 triệu đồng
Hoàn trả tiền cược Cược thua trong tuần 0.5% tổng số tiền cược
Thưởng sinh nhật Vào ngày sinh nhật Tùy theo cấp độ VIP

Việc tham gia các chương trình khuyến mãi không chỉ giúp người chơi gia tăng giá trị giải trí mà còn là cơ hội để giành được những phần thưởng giá trị. Tuy nhiên, người chơi cần đọc kỹ các điều khoản và điều kiện của từng chương trình khuyến mãi để đảm bảo mình đáp ứng đủ các yêu cầu.

Với sự đa dạng về trò chơi, các chương trình khuyến mãi hấp dẫn, và dịch vụ hỗ trợ khách hàng tận tình, 1xbet đã khẳng định được vị thế của mình là một trong những nền tảng giải trí trực tuyến hàng đầu. Đây là một địa chỉ đáng tin cậy cho những ai đang tìm kiếm những trải nghiệm cá cược và giải trí chất lượng.

Design and Develop by Ovatheme